<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

    <script>




        // 闭包：函数中的函数
        //    间接延长了变量的生命周期
        
        // 缺点：容易造成内存溢出


        // 实际上如果我们想使用一个局部变量a，可以直接把这个变量return   --- 实际上外面使用的是1这个值  它已经跟变量a没有了关系
        //    不直接return a   而是返回一个函数，让这个函数返回a    --- 外面就可以通过这个函数去控制这个a

        // function fn() {
        //     var a = 1 ;
        //     function f() {
        //         console.log(a);
        //     }
        // }


        // 当我们在函数中形成了嵌套关系的时候，内部函数就可以使用外部函数的局部变量



        // let money = 5000 ;

        // money += 10000 ;

        // money -= 40000 ;

        // 如上，如果直接使用全局变量，那么这个变量很容易遭到污染  --- 局部变量


        function f() {
            let money = 5000 ;
            return function(num , fuHao) {
                money = fuHao === '+' ? money + num : money - num 
                return money
            }
        }


        let res = f() ;
        // res 得到一个函数
        
        // 挣了1万
        console.log(res(10000 , '+'));   // 15000

        // 花了40000
        console.log(res(40000 , '-'));  // -25000





        console.log(f()(5000 , '+'));  // 10000


        console.log(res(10000 , '+'));  // -15000


        res = null ;  //  如果后面不再使用 ，就让res指向其他的值


        // money 这个变量被保护起来了
        // 又可以让自己被外部访问

       

    </script>
    
</body>
</html>